/*******************************************************************************
 * Copyright (c) 2014-3-14 @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>. All rights
 * reserved.
 *
 * Contributors: <a href="mailto:iffiff1@gmail.com">Tyler Chen</a> - initial API and implementation
 ******************************************************************************/
package org.iff.util;

import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.iff.util.validation.ValidationMethods;

import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Date;
import java.util.Map;

/**
 * 用于参数检查，并返回值，不符合的参数会抛出异常。
 *
 * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
 * @since 2018-08-19
 */
@SuppressWarnings("unchecked")
public class PreRequired {

    static String format(CharSequence message, Object... args) {
        if (message == null || args == null || args.length == 0) {
            return message == null ? null : message.toString();
        }
        int argCount = 0, len = message.length(), argLen = args.length;
        StringBuilder sb = new StringBuilder(len * 2);
        for (int i = 0; i < len; i++) {
            char c = message.charAt(i);
            if (c == '{' && (i + 1) < len && message.charAt(i + 1) == '}') {
                sb.append(String.valueOf(argCount < argLen ? args[argCount] : ""));
                i = i + 1;
                argCount = argCount + 1;
                continue;
            }
            sb.append(c);
        }
        return sb.toString();
    }

    static void ex(CharSequence message, CharSequence messageDefault, String errorCode, String errorCodeDefault, Object... args) {
        Exceptions.runtime(format(message == null ? messageDefault : message, args), errorCode == null ? errorCodeDefault : errorCode);
    }

    /**
     * 表达式需要为 true ，否则抛出异常。
     *
     * <pre>
     *     expression != true, throw RuntimeException.
     * </pre>
     *
     * @param expression 表达式
     * @param message    异常信息
     * @param <T>        表达式的类型
     * @return 表达式
     * @since 2018-08-19
     */
    public static <T> T requireTrue(T expression, CharSequence message, String errorCode, Object... args) {
        if (!Boolean.TRUE.equals(expression)) {
            ex(message, "Check failed - the expression must be true.", errorCode, "ERR-9101", args);
        }
        return expression;
    }

    /**
     * 表达式需要为 true ，否则抛出异常。
     *
     * <pre>
     *     expression != true, throw RuntimeException.
     * </pre>
     *
     * @param expression 表达式
     * @param message    异常信息
     * @param <T>        表达式的类型
     * @return 表达式
     * @since 2018-08-19
     */
    public static <T> T requireTrue(T expression, CharSequence message, Object... args) {
        return requireTrue(expression, message, null, args);
    }

    /**
     * 表达式需要为 true ，否则抛出异常。
     *
     * <pre>
     *     expression != true, throw RuntimeException.
     * </pre>
     *
     * @param expression 表达式
     * @param <T>        表达式的类型
     * @return 表达式
     * @since 2018-08-19
     */
    public static <T> T requireTrue(T expression) {
        return requireTrue(expression, null, null, null);
    }

    /**
     * 表达式需要为 false ，否则抛出异常。
     *
     * <pre>
     *     expression != false, throw RuntimeException.
     * </pre>
     *
     * @param expression 表达式
     * @param message    异常信息
     * @param <T>        表达式的类型
     * @return 表达式
     * @since 2018-08-19
     */
    public static <T> T requireFalse(T expression, CharSequence message, String errorCode, Object... args) {
        if (!Boolean.FALSE.equals(expression)) {
            ex(message, "Check failed - the expression must be false.", errorCode, "ERR-9102", args);
        }
        return expression;
    }

    /**
     * 表达式需要为 false ，否则抛出异常。
     *
     * <pre>
     *     expression != false, throw RuntimeException.
     * </pre>
     *
     * @param expression 表达式
     * @param message    异常信息
     * @param <T>        表达式的类型
     * @return 表达式
     * @since 2018-08-19
     */
    public static <T> T requireFalse(T expression, CharSequence message, Object... args) {
        return requireFalse(expression, message, null, args);
    }

    /**
     * 表达式需要为 false ，否则抛出异常。
     *
     * <pre>
     *     expression != false, throw RuntimeException.
     * </pre>
     *
     * @param expression 表达式
     * @param <T>        表达式的类型
     * @return 表达式
     * @since 2018-08-19
     */
    public static <T> T requireFalse(T expression) {
        return requireFalse(expression, null, null, null);
    }

    /**
     * 对象需要为 null ，否则抛出异常。
     *
     * <pre>
     *     object != null, throw RuntimeException.
     * </pre>
     *
     * @param object  对象
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象
     * @since 2018-08-19
     */
    public static <T> T requireNull(T object, CharSequence message, String errorCode, Object... args) {
        if (object != null) {
            ex(message, "Check failed - the object argument must be null.", errorCode, "ERR-9103", args);
        }
        return object;
    }

    /**
     * 对象需要为 null ，否则抛出异常。
     *
     * <pre>
     *     object != null, throw RuntimeException.
     * </pre>
     *
     * @param object  对象
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象
     * @since 2018-08-19
     */
    public static <T> T requireNull(T object, CharSequence message, Object... args) {
        return requireNull(object, message, null, args);
    }

    /**
     * 对象需要为 null ，否则抛出异常。
     *
     * <pre>
     *     object != null, throw RuntimeException.
     * </pre>
     *
     * @param object 对象
     * @param <T>    对象的类型
     * @return 对象
     * @since 2018-08-19
     */
    public static <T> T requireNull(T object) {
        return requireNull(object, null, null, null);
    }

    /**
     * 对象需要不为 null ，否则抛出异常。
     *
     * <pre>
     *     object == null, throw RuntimeException.
     * </pre>
     *
     * @param object  对象
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象
     */
    public static <T> T requireNotNull(T object, CharSequence message, String errorCode, Object... args) {
        if (object == null) {
            ex(message, "Check failed - the argument is required, it must not be null.", errorCode, "ERR-9104", args);
        }
        return object;
    }

    /**
     * 对象需要不为 null ，否则抛出异常。
     *
     * <pre>
     *     object == null, throw RuntimeException.
     * </pre>
     *
     * @param object  对象
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象
     */
    public static <T> T requireNotNull(T object, CharSequence message, Object... args) {
        return requireNotNull(object, message, null, args);
    }

    /**
     * 对象需要不为 null ，否则抛出异常。
     *
     * <pre>
     *     object == null, throw RuntimeException.
     * </pre>
     *
     * @param object 对象
     * @param <T>    对象的类型
     * @return 对象
     */
    public static <T> T requireNotNull(T object) {
        return requireNotNull(object, null, null, null);
    }

    /**
     * 对象需要为 empty ，否则抛出异常。
     *
     * <pre>
     *     object != null && object != "" && object != [] && object != {}, throw RuntimeException.
     * </pre>
     *
     * @param object  对象
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象
     */
    public static <T> T requireEmpty(T object, CharSequence message, String errorCode, Object... args) {
        boolean checkFail = false;
        if (object == null) {
        } else if (object instanceof CharSequence) {
            checkFail = StringUtils.isNotEmpty((CharSequence) object);
            message = message != null ? message : "Check failed - the CharSequence argument must be null or empty.";
        } else if (object instanceof Collection) {
            checkFail = !((Collection<?>) object).isEmpty();
            message = message != null ? message : "Check failed - the Collection argument must be null or empty.";
        } else if (object instanceof Map) {
            checkFail = !((Map<?, ?>) object).isEmpty();
            message = message != null ? message : "Check failed - the Map argument must be null or empty.";
        } else if (object.getClass().isArray()) {
            checkFail = Array.getLength(object) > 0;
            message = message != null ? message : "Check failed - the Array argument must be null or empty.";
        } else {
            checkFail = true;
            message = message != null ? message : "Check failed - the argument must be null or empty.";
        }
        if (checkFail) {
            ex(message, message, errorCode, "ERR-9105", args);
        }
        return object;
    }

    /**
     * 对象需要为 empty ，否则抛出异常。
     *
     * <pre>
     *     object != null && object != "" && object != [] && object != {}, throw RuntimeException.
     * </pre>
     *
     * @param object  对象
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象
     */
    public static <T> T requireEmpty(T object, CharSequence message, Object... args) {
        return requireEmpty(object, message, null, args);
    }

    /**
     * 对象需要为 empty ，否则抛出异常。
     *
     * <pre>
     *     object != null && object != "" && object != [] && object != {}, throw RuntimeException.
     * </pre>
     *
     * @param object 对象
     * @param <T>    对象的类型
     * @return 对象
     */
    public static <T> T requireEmpty(T object) {
        return requireEmpty(object, null, null, null);
    }

    /**
     * 对象需要不为 empty ，否则抛出异常。
     *
     * <pre>
     *     object == null || object == "" || object == [] || object == {}, throw RuntimeException.
     * </pre>
     *
     * @param object  对象
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象
     */
    public static <T> T requireNotEmpty(T object, CharSequence message, String errorCode, Object... args) {
        boolean checkFail = false;
        if ((checkFail = object == null)) {
            message = message != null ? message : "Check failed - the argument is required; it must not be null.";
        } else if (object instanceof CharSequence) {
            checkFail = StringUtils.isEmpty((CharSequence) object);
            message = message != null ? message : "Check failed - the CharSequence argument must not empty.";
        } else if (object instanceof Collection) {
            checkFail = ((Collection<?>) object).isEmpty();
            message = message != null ? message : "Check failed - the Collection argument must not empty.";
        } else if (object instanceof Map) {
            checkFail = ((Map<?, ?>) object).isEmpty();
            message = message != null ? message : "Check failed - the Map argument must not empty.";
        } else if (object.getClass().isArray()) {
            checkFail = Array.getLength(object) < 1;
            message = message != null ? message : "Check failed - the Array argument must not empty.";
        }
        if (checkFail) {
            ex(message, message, errorCode, "ERR-9106", args);
        }
        return object;
    }

    public static <T> T requireNotEmpty(T object, CharSequence message, Object... args) {
        return requireNotEmpty(object, message, null, args);
    }

    /**
     * 对象需要不为 empty ，否则抛出异常。
     *
     * <pre>
     *     object == null || object == "" || object == [] || object == {}, throw RuntimeException.
     * </pre>
     *
     * @param object 对象
     * @param <T>    对象的类型
     * @return 对象
     */
    public static <T> T requireNotEmpty(T object) {
        return requireNotEmpty(object, null, null, null);
    }

    /**
     * 对象需要为 blank ，否则抛出异常。
     *
     * <pre>
     *     text != null && text != "" && text != " ", StringUtils.isNotBlank(text), throw RuntimeException.
     * </pre>
     *
     * @param text    字符串
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象
     */
    public static <T extends CharSequence> T requireBlank(T text, CharSequence message, String errorCode, Object... args) {
        if (StringUtils.isNotBlank(text)) {
            ex(message, "Check failed - the CharSequence argument must be null or blank.", errorCode, "ERR-9107", args);
        }
        return text;
    }

    /**
     * 对象需要为 blank ，否则抛出异常。
     *
     * <pre>
     *     text != null && text != "" && text != " ", StringUtils.isNotBlank(text), throw RuntimeException.
     * </pre>
     *
     * @param text    字符串
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象
     */
    public static <T extends CharSequence> T requireBlank(T text, CharSequence message, Object... args) {
        return requireBlank(text, message, null, args);
    }

    /**
     * 对象需要为 blank ，否则抛出异常。
     *
     * <pre>
     *     text != null && text != "" && text != " ", StringUtils.isNotBlank(text), throw RuntimeException.
     * </pre>
     *
     * @param text 字符串
     * @param <T>  对象的类型
     * @return 对象
     */
    public static <T extends CharSequence> T requireBlank(T text) {
        return requireBlank(text, null, null, null);
    }

    /**
     * 对象需要不为 blank ，否则抛出异常。
     *
     * <pre>
     *     text == null || text == "" && text != " ", StringUtils.isBlank(text), throw RuntimeException.
     * </pre>
     *
     * @param text    字符串
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象
     */
    public static <T extends CharSequence> T requireNotBlank(T text, CharSequence message, String errorCode, Object... args) {
        if (StringUtils.isBlank(text)) {
            ex(message, "Check failed - the CharSequence argument must not be null or blank.", errorCode, "ERR-9108", args);
        }
        return text;
    }

    /**
     * 对象需要不为 blank ，否则抛出异常。
     *
     * <pre>
     *     text == null || text == "" && text != " ", StringUtils.isBlank(text), throw RuntimeException.
     * </pre>
     *
     * @param text    字符串
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象
     */
    public static <T extends CharSequence> T requireNotBlank(T text, CharSequence message, Object... args) {
        return requireNotBlank(text, message, null, args);
    }

    /**
     * 对象需要不为 blank ，否则抛出异常。
     *
     * <pre>
     *     text == null || text == "" && text != " ", StringUtils.isBlank(text), throw RuntimeException.
     * </pre>
     *
     * @param text 字符串
     * @param <T>  对象的类型
     * @return 对象
     */
    public static <T extends CharSequence> T requireNotBlank(T text) {
        return requireNotBlank(text, null, null, null);
    }

    /**
     * 对象需要被包含在第二参数内，否则抛出异常。
     *
     * <pre>
     *     substring == null || textToSearch == null || textToSearch.indexOf(substring) == -1 , throw RuntimeException.
     * </pre>
     *
     * @param substring    被包含的字符串
     * @param textToSearch 字符串
     * @param message      异常信息
     * @return 被包含的字符串
     */
    public static String requireBeContained(String substring, String textToSearch, CharSequence message, String errorCode, Object... args) {
        if (substring == null || textToSearch == null || textToSearch.indexOf(substring) == -1) {
            ex(message, "Check failed - the first argument must be contained in the second argument.", errorCode, "ERR-9109", args);
        }
        return substring;
    }

    /**
     * 对象需要被包含在第二参数内，否则抛出异常。
     *
     * <pre>
     *     substring == null || textToSearch == null || textToSearch.indexOf(substring) == -1 , throw RuntimeException.
     * </pre>
     *
     * @param substring    被包含的字符串
     * @param textToSearch 字符串
     * @param message      异常信息
     * @return 被包含的字符串
     */
    public static String requireBeContained(String substring, String textToSearch, CharSequence message, Object... args) {
        return requireBeContained(substring, textToSearch, message, null, args);
    }

    /**
     * 对象需要被包含在第二参数内，否则抛出异常。
     *
     * <pre>
     *     substring == null || textToSearch == null || textToSearch.indexOf(substring) == -1, throw RuntimeException.
     * </pre>
     *
     * @param substring    被包含的字符串
     * @param textToSearch 字符串
     * @return 被包含的字符串
     */
    public static String requireBeContained(String substring, String textToSearch) {
        return requireBeContained(substring, textToSearch, null, null, null);
    }

    /**
     * 对象需要被包含在第二参数内，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || !objects.contains(object), throw RuntimeException.
     * </pre>
     *
     * @param object  被包含的对象
     * @param objects 对象集合
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 被包含的对象
     */
    public static <T> T requireBeContained(T object, Collection<T> objects, CharSequence message, String errorCode, Object... args) {
        if (object == null || objects == null || !objects.contains(object)) {
            ex(message, "Check failed - the first argument must be contained in the second argument.", errorCode, "ERR-9110", args);
        }
        return object;
    }

    /**
     * 对象需要被包含在第二参数内，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || !objects.contains(object), throw RuntimeException.
     * </pre>
     *
     * @param object  被包含的对象
     * @param objects 对象集合
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 被包含的对象
     */
    public static <T> T requireBeContained(T object, Collection<T> objects, CharSequence message, Object... args) {
        return requireBeContained(object, objects, message, null, args);
    }

    /**
     * 对象需要被包含在第二参数内，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || !objects.contains(object), throw RuntimeException.
     * </pre>
     *
     * @param object  被包含的对象
     * @param objects 对象集合
     * @param <T>     对象的类型
     * @return 被包含的对象
     */
    public static <T> T requireBeContained(T object, Collection<T> objects) {
        return requireBeContained(object, objects, null, null, null);
    }

    /**
     * 对象需要被包含在第二参数内，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || !objects.containsKey(object), throw RuntimeException.
     * </pre>
     *
     * @param object  被包含的对象，KEY 检测
     * @param objects 对象集合
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 被包含的对象
     */
    public static <T> T requireBeContained(T object, Map<T, ?> objects, CharSequence message, String errorCode, Object... args) {
        if (object == null || objects == null || !objects.containsKey(object)) {
            ex(message, "Check failed - the first argument must be contained in the second argument.", errorCode, "ERR-9111", args);
        }
        return object;
    }

    /**
     * 对象需要被包含在第二参数内，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || !objects.containsKey(object), throw RuntimeException.
     * </pre>
     *
     * @param object  被包含的对象，KEY 检测
     * @param objects 对象集合
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 被包含的对象
     */
    public static <T> T requireBeContained(T object, Map<T, ?> objects, CharSequence message, Object... args) {
        return requireBeContained(object, objects, message, null, args);
    }

    /**
     * 对象需要被包含在第二参数内，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || !objects.containsKey(object), throw RuntimeException.
     * </pre>
     *
     * @param object  被包含的对象，KEY 检测
     * @param objects 对象集合
     * @param <T>     对象的类型
     * @return 被包含的对象
     */
    public static <T> T requireBeContained(T object, Map<T, ?> objects) {
        return requireBeContained(object, objects, null, null, null);
    }

    /**
     * 对象需要被包含在第二参数内，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || !ArrayUtils.contains(objects, object), throw RuntimeException.
     * </pre>
     *
     * @param object  被包含的对象
     * @param objects 对象集合
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 被包含的对象
     */
    public static <T> T requireBeContained(T object, T[] objects, CharSequence message, String errorCode, Object... args) {
        if (object == null || objects == null || !ArrayUtils.contains(objects, object)) {
            ex(message, "Check failed - the first argument must be contained in the second argument.", errorCode, "ERR-9112", args);
        }
        return object;
    }

    /**
     * 对象需要被包含在第二参数内，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || !ArrayUtils.contains(objects, object), throw RuntimeException.
     * </pre>
     *
     * @param object  被包含的对象
     * @param objects 对象集合
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 被包含的对象
     */
    public static <T> T requireBeContained(T object, T[] objects, CharSequence message, Object... args) {
        return requireBeContained(object, objects, message, null, args);
    }

    /**
     * 对象需要被包含在第二参数内，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || !ArrayUtils.contains(objects, object), throw RuntimeException.
     * </pre>
     *
     * @param object  被包含的对象
     * @param objects 对象集合
     * @param <T>     对象的类型
     * @return 被包含的对象
     */
    public static <T> T requireBeContained(T object, T[] objects) {
        return requireBeContained(object, objects, null, null, null);
    }

    /**
     * 对象需要包含第二参数，否则抛出异常。
     *
     * <pre>
     *     substring == null || textToSearch == null || textToSearch.indexOf(substring), throw RuntimeException.
     * </pre>
     *
     * @param textToSearch 字符串
     * @param substring    被包含的对象
     * @param message      异常信息
     * @return 字符串
     */
    public static String requireContains(String textToSearch, String substring, CharSequence message, String errorCode, Object... args) {
        if (substring == null || textToSearch == null || textToSearch.indexOf(substring) == -1) {
            ex(message, "Check failed - the first argument must contain the second argument.", errorCode, "ERR-9113", args);
        }
        return textToSearch;
    }

    /**
     * 对象需要包含第二参数，否则抛出异常。
     *
     * <pre>
     *     substring == null || textToSearch == null || textToSearch.indexOf(substring), throw RuntimeException.
     * </pre>
     *
     * @param textToSearch 字符串
     * @param substring    被包含的对象
     * @param message      异常信息
     * @return 字符串
     */
    public static String requireContains(String textToSearch, String substring, CharSequence message, Object... args) {
        return requireContains(textToSearch, substring, message, null, args);
    }

    /**
     * 对象需要包含第二参数，否则抛出异常。
     *
     * <pre>
     *     substring == null || textToSearch == null || textToSearch.indexOf(substring), throw RuntimeException.
     * </pre>
     *
     * @param textToSearch 字符串
     * @param substring    被包含的对象
     * @return 字符串
     */
    public static String requireContains(String textToSearch, String substring) {
        return requireContains(textToSearch, substring, null, null, null);
    }

    /**
     * 对象需要包含第二参数，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || !objects.contains(object), throw RuntimeException.
     * </pre>
     *
     * @param objects 对象集合
     * @param object  被包含的对象
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象集合
     */
    public static <T> Collection<T> requireContains(Collection<T> objects, T object, CharSequence message, String errorCode, Object... args) {
        if (object == null || objects == null || !objects.contains(object)) {
            ex(message, "Check failed - the first argument must contain the second argument.", errorCode, "ERR-9114", args);
        }
        return objects;
    }

    /**
     * 对象需要包含第二参数，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || !objects.contains(object), throw RuntimeException.
     * </pre>
     *
     * @param objects 对象集合
     * @param object  被包含的对象
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象集合
     */
    public static <T> Collection<T> requireContains(Collection<T> objects, T object, CharSequence message, Object... args) {
        return requireContains(objects, object, message, null, args);
    }

    /**
     * 对象需要包含第二参数，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || !objects.contains(object), throw RuntimeException.
     * </pre>
     *
     * @param objects 对象集合
     * @param object  被包含的对象
     * @param <T>     对象的类型
     * @return 对象集合
     */
    public static <T> Collection<T> requireContains(Collection<T> objects, T object) {
        return requireContains(objects, object, null, null, null);
    }

    /**
     * 对象需要包含第二参数，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || !objects.containsKey(object), throw RuntimeException.
     * </pre>
     *
     * @param objects 对象集合
     * @param object  被包含的对象
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象集合
     */
    public static <T> Map<T, ?> requireContains(Map<T, ?> objects, T object, CharSequence message, String errorCode, Object... args) {
        if (object == null || objects == null || !objects.containsKey(object)) {
            ex(message, "Check failed - the first argument must contain the second argument.", errorCode, "ERR-9115", args);
        }
        return objects;
    }

    /**
     * 对象需要包含第二参数，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || !objects.containsKey(object), throw RuntimeException.
     * </pre>
     *
     * @param objects 对象集合
     * @param object  被包含的对象
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象集合
     */
    public static <T> Map<T, ?> requireContains(Map<T, ?> objects, T object, CharSequence message, Object... args) {
        return requireContains(objects, object, message, null, args);
    }

    /**
     * 对象需要包含第二参数，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || !objects.containsKey(object), throw RuntimeException.
     * </pre>
     *
     * @param objects 对象集合
     * @param object  被包含的对象
     * @param <T>     对象的类型
     * @return 对象集合
     */
    public static <T> Map<T, ?> requireContains(Map<T, ?> objects, T object) {
        return requireContains(objects, object, null, null, null);
    }

    /**
     * 对象需要包含第二参数，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || !ArrayUtils.contains(objects, object), throw RuntimeException.
     * </pre>
     *
     * @param objects 对象集合
     * @param object  被包含的对象
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象集合
     */
    public static <T> T[] requireContains(T[] objects, T object, CharSequence message, String errorCode, Object... args) {
        if (object == null || objects == null || !ArrayUtils.contains(objects, object)) {
            ex(message, "Check failed - the first argument must contain the second argument.", errorCode, "ERR-9116", args);
        }
        return objects;
    }

    /**
     * 对象需要包含第二参数，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || !ArrayUtils.contains(objects, object), throw RuntimeException.
     * </pre>
     *
     * @param objects 对象集合
     * @param object  被包含的对象
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象集合
     */
    public static <T> T[] requireContains(T[] objects, T object, CharSequence message, Object... args) {
        return requireContains(objects, object, message, null, args);
    }

    /**
     * 对象需要包含第二参数，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || !ArrayUtils.contains(objects, object), throw RuntimeException.
     * </pre>
     *
     * @param objects 对象集合
     * @param object  被包含的对象
     * @param <T>     对象的类型
     * @return 对象集合
     */
    public static <T> T[] requireContains(T[] objects, T object) {
        return requireContains(objects, object, null, null, null);
    }

    /**
     * 对象需要不能被第二参数包含，否则抛出异常。
     *
     * <pre>
     *     substring == null || textToSearch == null || textToSearch.indexOf(substring) != -1, throw RuntimeException.
     * </pre>
     *
     * @param substring    不被包含的字符串
     * @param textToSearch 字符串
     * @param message      异常信息
     * @return 不被包含的字符串
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireNotBeContained(String substring, String textToSearch, CharSequence message, String errorCode, Object... args) {
        if (substring == null || textToSearch == null || textToSearch.indexOf(substring) != -1) {
            ex(message, "Check failed - the first argument must not be contained in the second argument.", errorCode, "ERR-9117", args);
        }
        return substring;
    }

    /**
     * 对象需要不能被第二参数包含，否则抛出异常。
     *
     * <pre>
     *     substring == null || textToSearch == null || textToSearch.indexOf(substring) != -1, throw RuntimeException.
     * </pre>
     *
     * @param substring    不被包含的字符串
     * @param textToSearch 字符串
     * @param message      异常信息
     * @return 不被包含的字符串
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireNotBeContained(String substring, String textToSearch, CharSequence message, Object... args) {
        return requireNotBeContained(substring, textToSearch, message, null, args);
    }

    /**
     * 对象不能被第二参数包含，否则抛出异常。
     *
     * <pre>
     *     substring == null || textToSearch == null || textToSearch.indexOf(substring) != -1, throw RuntimeException.
     * </pre>
     *
     * @param substring    不被包含的字符串
     * @param textToSearch 字符串
     * @return 不被包含的字符串
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireNotBeContained(String substring, String textToSearch) {
        return requireNotBeContained(substring, textToSearch, null, null, null);
    }

    /**
     * 对象不能被第二参数包含，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || objects.contains(object), throw RuntimeException.
     * </pre>
     *
     * @param object  不被包含的对象
     * @param objects 对象集合
     * @param message 异常信息
     * @return 不被包含的对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> T requireNotBeContained(T object, Collection<T> objects, CharSequence message, String errorCode, Object... args) {
        if (object == null || objects == null || objects.contains(object)) {
            ex(message, "Check failed - the first argument must not be contained in the second argument.", errorCode, "ERR-9118", args);
        }
        return object;
    }

    /**
     * 对象不能被第二参数包含，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || objects.contains(object), throw RuntimeException.
     * </pre>
     *
     * @param object  不被包含的对象
     * @param objects 对象集合
     * @param message 异常信息
     * @return 不被包含的对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> T requireNotBeContained(T object, Collection<T> objects, CharSequence message, Object... args) {
        return requireNotBeContained(object, objects, message, null, args);
    }

    /**
     * 对象不能被第二参数包含，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || objects.contains(object), throw RuntimeException.
     * </pre>
     *
     * @param object  不被包含的对象
     * @param objects 对象集合
     * @return 不被包含的对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> T requireNotBeContained(T object, Collection<T> objects) {
        return requireNotBeContained(object, objects, null, null, null);
    }

    /**
     * 对象不能被第二参数包含，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || objects.containsKey(object), throw RuntimeException.
     * </pre>
     *
     * @param object  不被包含的对象
     * @param objects 对象集合
     * @param message 异常信息
     * @return 不被包含的对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> T requireNotBeContained(T object, Map<T, ?> objects, CharSequence message, String errorCode, Object... args) {
        if (object == null || objects == null || objects.containsKey(object)) {
            ex(message, "Check failed - the first argument must not be contained in the second argument.", errorCode, "ERR-9119", args);
        }
        return object;
    }

    /**
     * 对象不能被第二参数包含，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || objects.containsKey(object), throw RuntimeException.
     * </pre>
     *
     * @param object  不被包含的对象
     * @param objects 对象集合
     * @param message 异常信息
     * @return 不被包含的对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> T requireNotBeContained(T object, Map<T, ?> objects, CharSequence message, Object... args) {
        return requireNotBeContained(object, objects, message, null, args);
    }

    /**
     * 对象不能被第二参数包含，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || objects.containsKey(object), throw RuntimeException.
     * </pre>
     *
     * @param object  不被包含的对象
     * @param objects 对象集合
     * @return 不被包含的对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> T requireNotBeContained(T object, Map<T, ?> objects) {
        return requireNotBeContained(object, objects, null, null, null);
    }

    /**
     * 对象不能被第二参数包含，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || ArrayUtils.contains(objects, object), throw RuntimeException.
     * </pre>
     *
     * @param object  不被包含的对象
     * @param objects 对象集合
     * @param message 异常信息
     * @return 不被包含的对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> T requireNotBeContained(T object, T[] objects, CharSequence message, String errorCode, Object... args) {
        if (object == null || objects == null || ArrayUtils.contains(objects, object)) {
            ex(message, "Check failed - the first argument must not be contained in the second argument.", errorCode, "ERR-9120", args);
        }
        return object;
    }

    /**
     * 对象不能被第二参数包含，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || ArrayUtils.contains(objects, object), throw RuntimeException.
     * </pre>
     *
     * @param object  不被包含的对象
     * @param objects 对象集合
     * @param message 异常信息
     * @return 不被包含的对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> T requireNotBeContained(T object, T[] objects, CharSequence message, Object... args) {
        return requireNotBeContained(object, objects, message, null, args);
    }

    /**
     * 对象不能被第二参数包含，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || ArrayUtils.contains(objects, object), throw RuntimeException.
     * </pre>
     *
     * @param object  不被包含的对象
     * @param objects 对象集合
     * @return 不被包含的对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> T requireNotBeContained(T object, T[] objects) {
        return requireNotBeContained(object, objects, null, null, null);
    }

    /**
     * 对象需要不能包含第二参数，否则抛出异常。
     *
     * <pre>
     *     substring == null || textToSearch == null || textToSearch.indexOf(substring) != -1, throw RuntimeException.
     * </pre>
     *
     * @param textToSearch 字符串
     * @param substring    不被包含的对象
     * @param message      异常信息
     * @return 字符串
     */
    public static String requireNotContain(String textToSearch, String substring, CharSequence message, String errorCode, Object... args) {
        if (substring == null || textToSearch == null || textToSearch.indexOf(substring) != -1) {
            ex(message, "Check failed - the first argument must not contain the second argument.", errorCode, "ERR-9121", args);
        }
        return textToSearch;
    }

    /**
     * 对象需要不能包含第二参数，否则抛出异常。
     *
     * <pre>
     *     substring == null || textToSearch == null || textToSearch.indexOf(substring) != -1, throw RuntimeException.
     * </pre>
     *
     * @param textToSearch 字符串
     * @param substring    不被包含的对象
     * @param message      异常信息
     * @return 字符串
     */
    public static String requireNotContain(String textToSearch, String substring, CharSequence message, Object... args) {
        return requireNotContain(textToSearch, substring, message, null, args);
    }

    /**
     * 对象需要不能包含第二参数，否则抛出异常。
     *
     * <pre>
     *     substring == null || textToSearch == null || textToSearch.indexOf(substring) != -1, throw RuntimeException.
     * </pre>
     *
     * @param textToSearch 字符串
     * @param substring    不被包含的对象
     * @return 字符串
     */
    public static String requireNotContain(String textToSearch, String substring) {
        return requireNotContain(textToSearch, substring, null, null, null);
    }

    /**
     * 对象需要不包含第二参数，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || objects.contains(object), throw RuntimeException.
     * </pre>
     *
     * @param objects 对象集合
     * @param object  不被包含的对象
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象集合
     */
    public static <T> Collection<T> requireNotContain(Collection<T> objects, T object, CharSequence message, String errorCode, Object... args) {
        if (object == null || objects == null || objects.contains(object)) {
            ex(message, "Check failed - the first argument must not contain the second argument.", errorCode, "ERR-9122", args);
        }
        return objects;
    }


    /**
     * 对象需要不包含第二参数，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || objects.contains(object), throw RuntimeException.
     * </pre>
     *
     * @param objects 对象集合
     * @param object  不被包含的对象
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象集合
     */
    public static <T> Collection<T> requireNotContain(Collection<T> objects, T object, CharSequence message, Object... args) {
        return requireNotContain(objects, object, message, null, args);
    }

    /**
     * 对象需要不包含第二参数，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || objects.contains(object), throw RuntimeException.
     * </pre>
     *
     * @param objects 对象集合
     * @param object  不被包含的对象
     * @param <T>     对象的类型
     * @return 对象集合
     */
    public static <T> Collection<T> requireNotContain(Collection<T> objects, T object) {
        return requireNotContain(objects, object, null, null, null);
    }

    /**
     * 对象需要不包含第二参数，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || objects.containsKey(object), throw RuntimeException.
     * </pre>
     *
     * @param objects 对象集合
     * @param object  不被包含的对象
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象集合
     */
    public static <T> Map<T, ?> requireNotContain(Map<T, ?> objects, T object, CharSequence message, String errorCode, Object... args) {
        if (object == null || objects == null || objects.containsKey(object)) {
            ex(message, "Check failed - the first argument must not contain the second argument.", errorCode, "ERR-9123", args);
        }
        return objects;
    }

    /**
     * 对象需要不包含第二参数，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || objects.containsKey(object), throw RuntimeException.
     * </pre>
     *
     * @param objects 对象集合
     * @param object  不被包含的对象
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象集合
     */
    public static <T> Map<T, ?> requireNotContain(Map<T, ?> objects, T object, CharSequence message, Object... args) {
        return requireNotContain(objects, object, message, null, args);
    }

    /**
     * 对象需要不包含第二参数，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || objects.containsKey(object), throw RuntimeException.
     * </pre>
     *
     * @param objects 对象集合
     * @param object  不被包含的对象
     * @param <T>     对象的类型
     * @return 对象集合
     */
    public static <T> Map<T, ?> requireNotContain(Map<T, ?> objects, T object) {
        return requireNotContain(objects, object, null, null, null);
    }

    /**
     * 对象需要不包含第二参数，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || ArrayUtils.contains(objects, object), throw RuntimeException.
     * </pre>
     *
     * @param objects 对象集合
     * @param object  不被包含的对象
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象集合
     */
    public static <T> T[] requireNotContain(T[] objects, T object, CharSequence message, String errorCode, Object... args) {
        if (object == null || objects == null || ArrayUtils.contains(objects, object)) {
            ex(message, "Check failed - the first argument must not contain the second argument.", errorCode, "ERR-9124", args);
        }
        return objects;
    }

    /**
     * 对象需要不包含第二参数，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || ArrayUtils.contains(objects, object), throw RuntimeException.
     * </pre>
     *
     * @param objects 对象集合
     * @param object  不被包含的对象
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象集合
     */
    public static <T> T[] requireNotContain(T[] objects, T object, CharSequence message, Object... args) {
        return requireNotContain(objects, object, message, null, args);
    }

    /**
     * 对象需要不包含第二参数，否则抛出异常。
     *
     * <pre>
     *     object == null || objects == null || ArrayUtils.contains(objects, object), throw RuntimeException.
     * </pre>
     *
     * @param objects 对象集合
     * @param object  不被包含的对象
     * @param <T>     对象的类型
     * @return 对象集合
     */
    public static <T> T[] requireNotContain(T[] objects, T object) {
        return requireNotContain(objects, object, null, null, null);
    }

    /**
     * 对象需要为类型的实例，否则抛出异常。
     *
     * <pre>
     *     !type.isInstance(object), throw RuntimeException.
     * </pre>
     *
     * @param object  对象
     * @param type    类型
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> T requireInstanceOf(T object, Class<?> type, CharSequence message, String errorCode, Object... args) {
        if (type == null || !type.isInstance(object)) {
            ex(message, "Check failed - the first argument must be instanceof the second argument.", errorCode, "ERR-9125", args);
        }
        return object;
    }

    /**
     * 对象需要为类型的实例，否则抛出异常。
     *
     * <pre>
     *     !type.isInstance(object), throw RuntimeException.
     * </pre>
     *
     * @param object  对象
     * @param type    类型
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> T requireInstanceOf(T object, Class<?> type, CharSequence message, Object... args) {
        return requireInstanceOf(object, type, message, null, args);
    }

    /**
     * 对象需要为类型的实例，否则抛出异常。
     *
     * <pre>
     *     !type.isInstance(object), throw RuntimeException.
     * </pre>
     *
     * @param object 对象
     * @param type   类型
     * @param <T>    对象的类型
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> T requireInstanceOf(T object, Class<?> type) {
        return requireInstanceOf(object, type, null, null, null);
    }

    /**
     * 对象类型需要为第二参数类型的子类型，否则抛出异常。
     *
     * @param subType   对象类型
     * @param superType 父类型
     * @param message   异常信息
     * @param <T>       对象的类型
     * @return 对象类型
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> Class<T> requireSubType(Class<T> subType, Class<?> superType, CharSequence message, String errorCode, Object... args) {
        if (subType == null || superType == null || !superType.isAssignableFrom(subType)) {
            ex(message, "Check failed - the argument must be assignable by the second argument.", errorCode, "ERR-9126", args);
        }
        return subType;
    }

    /**
     * 对象类型需要为第二参数类型的子类型，否则抛出异常。
     *
     * @param subType   对象类型
     * @param superType 父类型
     * @param message   异常信息
     * @param <T>       对象的类型
     * @return 对象类型
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> Class<T> requireSubType(Class<T> subType, Class<?> superType, CharSequence message, Object... args) {
        return requireSubType(subType, superType, message, null, args);
    }

    /**
     * 对象类型需要为第二参数类型的子类型，否则抛出异常。
     *
     * @param subType   对象类型
     * @param superType 父类型
     * @param <T>       对象的类型
     * @return 对象类型
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> Class<T> requireSubType(Class<T> subType, Class<?> superType) {
        return requireSubType(subType, superType, null, null, null);
    }

    /**
     * 对象需要为 Email 地址，否则抛出异常。
     *
     * @param email   Email
     * @param message 异常信息
     * @return Email
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireEmail(String email, CharSequence message, String errorCode, Object... args) {
        if (!(ValidationMethods.email(email))) {
            ex(message, "Check failed - the argument must be email address.", errorCode, "ERR-9127", args);
        }
        return email;
    }

    /**
     * 对象需要为 Email 地址，否则抛出异常。
     *
     * @param email   Email
     * @param message 异常信息
     * @return Email
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireEmail(String email, CharSequence message, Object... args) {
        return requireEmail(email, message, null, args);
    }

    /**
     * 对象需要为 Email 地址，否则抛出异常。
     *
     * @param email Email
     * @return Email
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireEmail(String email) {
        return requireEmail(email, null, null, null);
    }

    /**
     * 对象需要为 Url 地址，否则抛出异常。
     *
     * @param url     URL
     * @param message 异常信息
     * @return URL
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireUrl(String url, CharSequence message, String errorCode, Object... args) {
        if (!(ValidationMethods.url(url))) {
            ex(message, "Check failed - the argument must be url address.", errorCode, "ERR-9128", args);
        }
        return url;
    }

    /**
     * 对象需要为 Url 地址，否则抛出异常。
     *
     * @param url     URL
     * @param message 异常信息
     * @return URL
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireUrl(String url, CharSequence message, Object... args) {
        return requireUrl(url, message, null, args);
    }

    /**
     * 对象需要为 URL 地址，否则抛出异常。
     *
     * @param url URL
     * @return URL
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireUrl(String url) {
        return requireUrl(url, null, null, null);
    }

    /**
     * 对象需要达到最小长度，否则抛出异常。
     *
     * @param value   字符串
     * @param min     最小长度
     * @param message 异常信息
     * @return 字符串
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireMinLength(String value, int min, CharSequence message, String errorCode, Object... args) {
        if (!(ValidationMethods.minLength(value, min))) {
            ex(message, "Check failed - the argument must have min length.", errorCode, "ERR-9129", args);
        }
        return value;
    }

    /**
     * 对象需要达到最小长度，否则抛出异常。
     *
     * @param value   字符串
     * @param min     最小长度
     * @param message 异常信息
     * @return 字符串
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireMinLength(String value, int min, CharSequence message, Object... args) {
        return requireMinLength(value, min, message, null, args);
    }

    /**
     * 对象需要达到最小长度，否则抛出异常。
     *
     * @param value 字符串
     * @param min   最小长度
     * @return 字符串
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireMinLength(String value, int min) {
        return requireMinLength(value, min, null, null, null);
    }

    /**
     * 对象需要达到最小长度，否则抛出异常。
     *
     * @param value   对象集合
     * @param min     最小长度
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象集合
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> T[] requireMinLength(T[] value, int min, CharSequence message, String errorCode, Object... args) {
        if (value != null && value.length < min) {
            ex(message, "Check failed - the argument must have min length.", errorCode, "ERR-9130", args);
        }
        return value;
    }

    /**
     * 对象需要达到最小长度，否则抛出异常。
     *
     * @param value   对象集合
     * @param min     最小长度
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象集合
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> T[] requireMinLength(T[] value, int min, CharSequence message, Object... args) {
        return requireMinLength(value, min, message, null, args);
    }

    /**
     * 对象需要达到最小长度，否则抛出异常。
     *
     * @param value 字符串
     * @param min   最小长度
     * @param <T>   对象的类型
     * @return 字符串
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> T[] requireMinLength(T[] value, int min) {
        return requireMinLength(value, min, null, null, null);
    }

    /**
     * 对象需要达到最小长度，否则抛出异常。
     *
     * @param value   对象集合
     * @param min     最小长度
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象集合
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> Collection<T> requireMinLength(Collection<T> value, int min, CharSequence message, String errorCode, Object... args) {
        if (value != null && value.size() < min) {
            ex(message, "Check failed - the argument must have min length.", errorCode, "ERR-9131", args);
        }
        return value;
    }

    /**
     * 对象需要达到最小长度，否则抛出异常。
     *
     * @param value   对象集合
     * @param min     最小长度
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象集合
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> Collection<T> requireMinLength(Collection<T> value, int min, CharSequence message, Object... args) {
        return requireMinLength(value, min, message, null, args);
    }

    /**
     * 对象需要达到最小长度，否则抛出异常。
     *
     * @param value 字符串
     * @param min   最小长度
     * @param <T>   对象的类型
     * @return 字符串
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> Collection<T> requireMinLength(Collection<T> value, int min) {
        return requireMinLength(value, min, null, null, null);
    }

    /**
     * 对象需要达到最小长度，否则抛出异常。
     *
     * @param value   对象集合
     * @param min     最小长度
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象集合
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> Map<T, ?> requireMinLength(Map<T, ?> value, int min, CharSequence message, String errorCode, Object... args) {
        if (value != null && value.size() < min) {
            ex(message, "Check failed - the argument must have min length.", errorCode, "ERR-9132", args);
        }
        return value;
    }

    /**
     * 对象需要达到最小长度，否则抛出异常。
     *
     * @param value   对象集合
     * @param min     最小长度
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象集合
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> Map<T, ?> requireMinLength(Map<T, ?> value, int min, CharSequence message, Object... args) {
        return requireMinLength(value, min, message, null, args);
    }

    /**
     * 对象需要达到最小长度，否则抛出异常。
     *
     * @param value 字符串
     * @param min   最小长度
     * @param <T>   对象的类型
     * @return 字符串
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> Map<T, ?> requireMinLength(Map<T, ?> value, int min) {
        return requireMinLength(value, min, null, null, null);
    }

    /**
     * 对象需要不超过最大长度，否则抛出异常。
     *
     * @param value   字符串
     * @param max     最大长度
     * @param message 异常信息
     * @return 字符串
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireMaxLength(String value, int max, CharSequence message, String errorCode, Object... args) {
        if (!(ValidationMethods.maxLength(value, max))) {
            ex(message, "Check failed - the argument must not over max length.", errorCode, "ERR-9133", args);
        }
        return value;
    }

    /**
     * 对象需要不超过最大长度，否则抛出异常。
     *
     * @param value   字符串
     * @param max     最大长度
     * @param message 异常信息
     * @return 字符串
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireMaxLength(String value, int max, CharSequence message, Object... args) {
        return requireMaxLength(value, max, message, null, args);
    }

    /**
     * 对象需要不超过最大长度，否则抛出异常。
     *
     * @param value 字符串
     * @param max   最大长度
     * @return 字符串
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireMaxLength(String value, int max) {
        return requireMaxLength(value, max, null, null, null);
    }

    /**
     * 对象需要不超过最大长度，否则抛出异常。
     *
     * @param value   对象
     * @param max     最大长度
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> T[] requireMaxLength(T[] value, int max, CharSequence message, String errorCode, Object... args) {
        if (value != null && value.length > max) {
            ex(message, "Check failed - the argument must not over max length.", errorCode, "ERR-9134", args);
        }
        return value;
    }

    /**
     * 对象需要不超过最大长度，否则抛出异常。
     *
     * @param value   对象
     * @param max     最大长度
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> T[] requireMaxLength(T[] value, int max, CharSequence message, Object... args) {
        return requireMaxLength(value, max, message, null, args);
    }

    /**
     * 对象需要不超过最大长度，否则抛出异常。
     *
     * @param value 对象
     * @param max   最大长度
     * @param <T>   对象的类型
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> T[] requireMaxLength(T[] value, int max) {
        return requireMaxLength(value, max, null, null, null);
    }

    /**
     * 对象需要不超过最大长度，否则抛出异常。
     *
     * @param value   对象
     * @param max     最大长度
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> Collection<T> requireMaxLength(Collection<T> value, int max, CharSequence message, String errorCode, Object... args) {
        if (value != null && value.size() > max) {
            ex(message, "Check failed - the argument must not over max length.", errorCode, "ERR-9135", args);
        }
        return value;
    }

    /**
     * 对象需要不超过最大长度，否则抛出异常。
     *
     * @param value   对象
     * @param max     最大长度
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> Collection<T> requireMaxLength(Collection<T> value, int max, CharSequence message, Object... args) {
        return requireMaxLength(value, max, message, null, args);
    }

    /**
     * 对象需要不超过最大长度，否则抛出异常。
     *
     * @param value 对象
     * @param max   最大长度
     * @param <T>   对象的类型
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> Collection<T> requireMaxLength(Collection<T> value, int max) {
        return requireMaxLength(value, max, null, null, null);
    }

    /**
     * 对象需要不超过最大长度，否则抛出异常。
     *
     * @param value   对象
     * @param max     最大长度
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> Map<T, ?> requireMaxLength(Map<T, ?> value, int max, CharSequence message, String errorCode, Object... args) {
        if (value != null && value.size() > max) {
            ex(message, "Check failed - the argument must not over max length.", errorCode, "ERR-9136", args);
        }
        return value;
    }

    /**
     * 对象需要不超过最大长度，否则抛出异常。
     *
     * @param value   对象
     * @param max     最大长度
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> Map<T, ?> requireMaxLength(Map<T, ?> value, int max, CharSequence message, Object... args) {
        return requireMaxLength(value, max, message, null, args);
    }

    /**
     * 对象需要不超过最大长度，否则抛出异常。
     *
     * @param value 对象
     * @param max   最大长度
     * @param <T>   对象的类型
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> Map<T, ?> requireMaxLength(Map<T, ?> value, int max) {
        return requireMaxLength(value, max, null, null, null);
    }

    /**
     * 对象需要在指定长度范围内，否则抛出异常。
     *
     * @param value   字符串
     * @param min     最小长度
     * @param max     最大长度
     * @param message 异常信息
     * @return 字符串
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireRangeLength(String value, int min, int max, CharSequence message, String errorCode, Object... args) {
        if (!(ValidationMethods.rangeLength(value, min, max))) {
            Exceptions.runtime(format(message, args), "ERROR-REQ-014");
            ex(message, "Check failed - the argument must between min and max length.", errorCode, "ERR-9137", args);
        }
        return value;
    }

    /**
     * 对象需要在指定长度范围内，否则抛出异常。
     *
     * @param value   字符串
     * @param min     最小长度
     * @param max     最大长度
     * @param message 异常信息
     * @return 字符串
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireRangeLength(String value, int min, int max, CharSequence message, Object... args) {
        return requireRangeLength(value, min, max, message, null, args);
    }

    /**
     * 对象需要在指定长度范围内，否则抛出异常。
     *
     * @param value 字符串
     * @param min   最小长度
     * @param max   最大长度
     * @return 字符串
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireRangeLength(String value, int min, int max) {
        return requireRangeLength(value, min, max, null, null, null);
    }

    /**
     * 对象需要在指定长度范围内，否则抛出异常。
     *
     * @param value   对象
     * @param min     最小长度
     * @param max     最大长度
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> T[] requireRangeLength(T[] value, int min, int max, CharSequence message, String errorCode, Object... args) {
        if (value != null && !(value.length <= max && value.length >= min)) {
            ex(message, "Check failed - the argument must between min and max length.", errorCode, "ERR-9138", args);
        }
        return value;
    }

    /**
     * 对象需要在指定长度范围内，否则抛出异常。
     *
     * @param value   对象
     * @param min     最小长度
     * @param max     最大长度
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> T[] requireRangeLength(T[] value, int min, int max, CharSequence message, Object... args) {
        return requireRangeLength(value, min, max, message, null, args);
    }

    /**
     * 对象需要在指定长度范围内，否则抛出异常。
     *
     * @param value 对象
     * @param min   最小长度
     * @param max   最大长度
     * @param <T>   对象的类型
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> T[] requireRangeLength(T[] value, int min, int max) {
        return requireRangeLength(value, min, max, null, null, null);
    }

    /**
     * 对象需要在指定长度范围内，否则抛出异常。
     *
     * @param value   对象
     * @param min     最小长度
     * @param max     最大长度
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> Collection<T> requireRangeLength(Collection<T> value, int min, int max, CharSequence message, String errorCode, Object... args) {
        if (value != null && !(value.size() <= max && value.size() >= min)) {
            ex(message, "Check failed - the argument must between min and max length.", errorCode, "ERR-9139", args);
        }
        return value;
    }

    /**
     * 对象需要在指定长度范围内，否则抛出异常。
     *
     * @param value   对象
     * @param min     最小长度
     * @param max     最大长度
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> Collection<T> requireRangeLength(Collection<T> value, int min, int max, CharSequence message, Object... args) {
        return requireRangeLength(value, min, max, message, null, args);
    }

    /**
     * 对象需要不超过最大长度，否则抛出异常。
     *
     * @param value 对象
     * @param min   最小长度
     * @param max   最大长度
     * @param <T>   对象的类型
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> Collection<T> requireRangeLength(Collection<T> value, int min, int max) {
        return requireRangeLength(value, min, max, null, null, null);
    }

    /**
     * 对象需要不超过最大长度，否则抛出异常。
     *
     * @param value   对象
     * @param min     最小长度
     * @param max     最大长度
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> Map<T, ?> requireRangeLength(Map<T, ?> value, int min, int max, CharSequence message, String errorCode, Object... args) {
        if (value != null && !(value.size() <= max && value.size() >= min)) {
            ex(message, "Check failed - the argument must between min and max length.", errorCode, "ERR-9140", args);
        }
        return value;
    }

    /**
     * 对象需要不超过最大长度，否则抛出异常。
     *
     * @param value   对象
     * @param min     最小长度
     * @param max     最大长度
     * @param message 异常信息
     * @param <T>     对象的类型
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> Map<T, ?> requireRangeLength(Map<T, ?> value, int min, int max, CharSequence message, Object... args) {
        return requireRangeLength(value, min, max, message, null, args);
    }

    /**
     * 对象需要不超过最大长度，否则抛出异常。
     *
     * @param value 对象
     * @param min   最小长度
     * @param max   最大长度
     * @param <T>   对象的类型
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static <T> Map<T, ?> requireRangeLength(Map<T, ?> value, int min, int max) {
        return requireRangeLength(value, min, max, null, null, null);
    }


    /**
     * 对象需要不小于最小值，否则抛出异常。
     *
     * @param value   对象
     * @param min     最小值
     * @param message 异常信息
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireGreaterEqualThan(String value, Number min, CharSequence message, String errorCode, Object... args) {
        if (!(ValidationMethods.min(value, min))) {
            ex(message, "Check failed - the argument must greater or equal than min value.", errorCode, "ERR-9141", args);
        }
        return value;
    }

    /**
     * 对象需要不小于最小值，否则抛出异常。
     *
     * @param value   对象
     * @param min     最小值
     * @param message 异常信息
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireGreaterEqualThan(String value, Number min, CharSequence message, Object... args) {
        return requireGreaterEqualThan(value, min, message, null, args);
    }

    /**
     * 对象需要不小于最小值，否则抛出异常。
     *
     * @param value 对象
     * @param min   最小值
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireGreaterEqualThan(String value, Number min) {
        return requireGreaterEqualThan(value, min, null, null, null);
    }

    /**
     * 对象需要不小于最小值，否则抛出异常。
     *
     * @param value   对象
     * @param min     最小值
     * @param message 异常信息
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static Number requireGreaterEqualThan(Number value, Number min, CharSequence message, String errorCode, Object... args) {
        if (!(ValidationMethods.min(value, min))) {
            ex(message, "Check failed - the argument must greater or equal than min value.", errorCode, "ERR-9142", args);
        }
        return value;
    }

    /**
     * 对象需要不小于最小值，否则抛出异常。
     *
     * @param value   对象
     * @param min     最小值
     * @param message 异常信息
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static Number requireGreaterEqualThan(Number value, Number min, CharSequence message, Object... args) {
        return requireGreaterEqualThan(value, min, message, null, args);
    }

    /**
     * 对象需要不小于最小值，否则抛出异常。
     *
     * @param value 对象
     * @param min   最小值
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static Number requireGreaterEqualThan(Number value, Number min) {
        return requireGreaterEqualThan(value, min, null, null, null);
    }

    /**
     * 对象需要不大于最大值，否则抛出异常。
     *
     * @param value   对象
     * @param max     最大值
     * @param message 异常信息
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireLessEqualThan(String value, Number max, CharSequence message, String errorCode, Object... args) {
        if (!(ValidationMethods.max(value, max))) {
            ex(message, "Check failed - the argument must less or equal than max value.", errorCode, "ERR-9143", args);
        }
        return value;
    }

    /**
     * 对象需要不大于最大值，否则抛出异常。
     *
     * @param value   对象
     * @param max     最大值
     * @param message 异常信息
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireLessEqualThan(String value, Number max, CharSequence message, Object... args) {
        return requireLessEqualThan(value, max, message, null, args);
    }

    /**
     * 对象需要不大于最大值，否则抛出异常。
     *
     * @param value 对象
     * @param max   最大值
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireLessEqualThan(String value, Number max) {
        return requireLessEqualThan(value, max, null, null, null);
    }

    /**
     * 对象需要不大于最大值，否则抛出异常。
     *
     * @param value   对象
     * @param max     最大值
     * @param message 异常信息
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static Number requireLessEqualThan(Number value, Number max, CharSequence message, String errorCode, Object... args) {
        if (!(ValidationMethods.max(value, max))) {
            ex(message, "Check failed - the argument must less or equal than max value.", errorCode, "ERR-9144", args);
        }
        return value;
    }

    /**
     * 对象需要不大于最大值，否则抛出异常。
     *
     * @param value   对象
     * @param max     最大值
     * @param message 异常信息
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static Number requireLessEqualThan(Number value, Number max, CharSequence message, Object... args) {
        return requireLessEqualThan(value, max, message, null, args);
    }

    /**
     * 对象需要不大于最大值，否则抛出异常。
     *
     * @param value 对象
     * @param max   最大值
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static Number requireLessEqualThan(Number value, Number max) {
        return requireLessEqualThan(value, max, null, null, null);
    }


    /**
     * 对象需要在最小值与最大值之间，否则抛出异常。
     *
     * @param value   对象
     * @param min     最小值
     * @param max     最大值
     * @param message 异常信息
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireRange(String value, Number min, Number max, CharSequence message, String errorCode, Object... args) {
        if (!(ValidationMethods.range(value, min, max))) {
            ex(message, "Check failed - the argument must between min and max value.", errorCode, "ERR-9145", args);
        }
        return value;
    }

    /**
     * 对象需要在最小值与最大值之间，否则抛出异常。
     *
     * @param value   对象
     * @param min     最小值
     * @param max     最大值
     * @param message 异常信息
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireRange(String value, Number min, Number max, CharSequence message, Object... args) {
        return requireRange(value, min, max, message, null, args);
    }

    /**
     * 对象需要在最小值与最大值之间，否则抛出异常。
     *
     * @param value 对象
     * @param min   最小值
     * @param max   最大值
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireRange(String value, Number min, Number max) {
        return requireRange(value, min, max, null, null, null);
    }

    /**
     * 对象需要在最小值与最大值之间，否则抛出异常。
     *
     * @param value   对象
     * @param min     最小值
     * @param max     最大值
     * @param message 异常信息
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static Number requireRange(Number value, Number min, Number max, CharSequence message, String errorCode, Object... args) {
        if (!(ValidationMethods.range(value, min, max))) {
            ex(message, "Check failed - the argument must between min and max value.", errorCode, "ERR-9146", args);
        }
        return value;
    }

    /**
     * 对象需要在最小值与最大值之间，否则抛出异常。
     *
     * @param value   对象
     * @param min     最小值
     * @param max     最大值
     * @param message 异常信息
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static Number requireRange(Number value, Number min, Number max, CharSequence message, Object... args) {
        return requireRange(value, min, max, message, null, args);
    }

    /**
     * 对象需要在最小值与最大值之间，否则抛出异常。
     *
     * @param value 对象
     * @param min   最小值
     * @param max   最大值
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static Number requireRange(Number value, Number min, Number max) {
        return requireRange(value, min, max, null, null, null);
    }

    /**
     * 对象需要为日期格式，否则抛出异常。
     *
     * <pre>
     *     日期格式：yyyy-MM-dd HH:mm:ss, yyyy-MM-dd, yyyy/MM/dd HH:mm:ss, yyyy/MM/dd, yyyy-MM-dd'T'HH:mm:ss.SSS, yyyy-MM-dd'T'HH:mm:ss.SSSXXX, dd MMM yyyy
     * </pre>
     *
     * @param value   对象
     * @param message 异常信息
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static Date requireDate(String value, CharSequence message, String errorCode, Object... args) {
        try {
            return DateUtils.parseDate(value, "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd",
                    "yyyy-MM-dd'T'HH:mm:ss.SSS", "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", "dd MMM yyyy");
        } catch (Exception e) {
        }
        ex(message, "Check failed - the argument must be date format.", errorCode, "ERR-9147", args);
        return null;
    }

    /**
     * 对象需要为日期格式，否则抛出异常。
     *
     * <pre>
     *     日期格式：yyyy-MM-dd HH:mm:ss, yyyy-MM-dd, yyyy/MM/dd HH:mm:ss, yyyy/MM/dd, yyyy-MM-dd'T'HH:mm:ss.SSS, yyyy-MM-dd'T'HH:mm:ss.SSSXXX, dd MMM yyyy
     * </pre>
     *
     * @param value   对象
     * @param message 异常信息
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static Date requireDate(String value, CharSequence message, Object... args) {
        return requireDate(value, message, null, args);
    }

    /**
     * 对象需要为日期格式，否则抛出异常。
     *
     * <pre>
     *     日期格式：yyyy-MM-dd HH:mm:ss, yyyy-MM-dd, yyyy/MM/dd HH:mm:ss, yyyy/MM/dd, yyyy-MM-dd'T'HH:mm:ss.SSS, yyyy-MM-dd'T'HH:mm:ss.SSSXXX, dd MMM yyyy
     * </pre>
     *
     * @param value 对象
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static Date requireDate(String value) {
        return requireDate(value, null, null, null);
    }

    /**
     * 对象需要为ipv4格式，否则抛出异常。
     *
     * @param value   对象
     * @param message 异常信息
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireIpv4(String value, CharSequence message, String errorCode, Object... args) {
        if (!(ValidationMethods.ipv4(value))) {
            ex(message, "Check failed - the argument must be ipv4 format.", errorCode, "ERR-9148", args);
        }
        return value;
    }

    /**
     * 对象需要为ipv4格式，否则抛出异常。
     *
     * @param value   对象
     * @param message 异常信息
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireIpv4(String value, CharSequence message, Object... args) {
        return requireIpv4(value, message, null, args);
    }

    /**
     * 对象需要为ipv4格式，否则抛出异常。
     *
     * @param value 对象
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireIpv4(String value) {
        return requireIpv4(value, null, null, null);
    }

    /**
     * 对象需要为ipv6格式，否则抛出异常。
     *
     * @param value   对象
     * @param message 异常信息
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireIpv6(String value, CharSequence message, String errorCode, Object... args) {
        if (!(ValidationMethods.ipv6(value))) {
            ex(message, "Check failed - the argument must be ipv6 format.", errorCode, "ERR-9149", args);
        }
        return value;
    }

    /**
     * 对象需要为ipv6格式，否则抛出异常。
     *
     * @param value   对象
     * @param message 异常信息
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireIpv6(String value, CharSequence message, Object... args) {
        return requireIpv6(value, message, null, args);
    }

    /**
     * 对象需要为ipv6格式，否则抛出异常。
     *
     * @param value 对象
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireIpv6(String value) {
        return requireIpv6(value, null, null, null);
    }

    /**
     * 对象需要匹配指定的正则表达式，否则抛出异常。
     *
     * @param value   对象
     * @param message 异常信息
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireMatch(String value, String pattern, CharSequence message, String errorCode, Object... args) {
        if (!(ValidationMethods.pattern(value, pattern))) {
            ex(message, "Check failed - the argument must match the pattern.", errorCode, "ERR-9150", args);
        }
        return value;
    }

    /**
     * 对象需要匹配指定的正则表达式，否则抛出异常。
     *
     * @param value   对象
     * @param message 异常信息
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireMatch(String value, String pattern, CharSequence message, Object... args) {
        return requireMatch(value, pattern, message, null, args);
    }

    /**
     * 对象需要匹配指定的正则表达式，否则抛出异常。
     *
     * @param value 对象
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireMatch(String value, String pattern) {
        return requireMatch(value, pattern, null, null, null);
    }

    /**
     * 对象需要为中文，否则抛出异常。
     *
     * @param value   对象
     * @param message 异常信息
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireChinese(String value, CharSequence message, String errorCode, Object... args) {
        if (!(ValidationMethods.chinese(value))) {
            ex(message, "Check failed - the argument must be chinese character.", errorCode, "ERR-9151", args);
        }
        return value;
    }

    /**
     * 对象需要为中文，否则抛出异常。
     *
     * @param value   对象
     * @param message 异常信息
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireChinese(String value, CharSequence message, Object... args) {
        return requireChinese(value, message, null, args);
    }

    /**
     * 对象需要为中文，否则抛出异常。
     *
     * @param value 对象
     * @return 对象
     * @author <a href="mailto:iffiff1@gmail.com">Tyler Chen</a>
     */
    public static String requireChinese(String value) {
        return requireChinese(value, null, null, null);
    }
}
